#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
const int N=1e7+10;

int vis[2022];
int h[N],ne[N],to[N],w[N],idx;
int dist[2022];
struct cmp
{
	bool operator()(const pair<int,int>& p1,const pair<int,int>& p2)
	{
		return p1.second>p2.second;
	}
};
void add(int x,int y,int z)
{
	ne[idx]=h[x];
	to[idx]=y;
	w[idx]=z;
	h[x]=idx++;
}
int get_gcd(int x,int y)
{
	return y==0?x:get_gcd(y,x%y);
}
void init()
{
	for(int i=1;i<=2021;i++)
	{
		for(int j=i+1;j<=2021;j++)
		{
			if(j-i<=21)
			{
				int g=get_gcd(j,i);
				int z=i*j/g;
				add(i,j,z);
				add(j,i,z);
			}
		}
	}
}
void dijkstra()
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;
	q.push({1,0});
	while(q.size())
	{
		int u=q.top().first;
		
		q.pop();

		vis[u]=1;
		for(int i=h[u];~i;i=ne[i])
		{
			int j=to[i];
			if(vis[j])
			{
				continue;
			}
			if(dist[u]+w[i]<dist[j])
			{
				dist[j]=dist[u]+w[i];
				q.push({j,dist[j]});
			}
		}
	}
}
int main()
{
	memset(h,-1,sizeof(h));
	init();
	memset(dist,0x3f3f3f3f,sizeof(dist));
	dist[1]=0;
	dijkstra();
	cout<<dist[2021];
	return 0;
}
